International aid may take the form of multilateral aid – provided
through international bodies such as the UN, or NGOs such as Oxfam – or
bilateral aid, which operates on a government-to-government basis. There
is considerable debate about whether international aid works, in the
sense of reducing poverty and stimulating development.
However, the effectiveness of aid is often diluted by corruption. Aid
is invariably channeled through the governments of recipient countries,
in which power is often concentrated in the hands of a few politicians
and bureaucrats, and the mechanisms of accountability are, at best,
poorly developed. This tends to benefit corrupt leaders and elites
rather than the people, projects and programs for which it was
intended.
The hypothesis that foreign aid can promote growth in developing
countries was explored, using panel data series for foreign aid, while
accounting for regional differences in Asian, African, Latin American,
and the Caribbean countries as well as the differences in income levels,
the results of this study also indicate that foreign aid has mixed
effects on economic growth in developing countries.
This study examines the relationships between foreign aid,
institutional structure, and economic performance for 80 countries in
Europe, America, Africa, and Asia. It is found that official development
assistance and the quality of institutional structure in the sample
countries affect economic growth positively.
Cargando Librerias
Algunas librerias y paquetes usados para obtener y descargar los
datos
library(tidyverse) # manejo de dataframes
library(WDI) # libreria para acceder a metadata de banco mundial
library(readxl) # leer archivos de excel
library(readr) # leer archivos csv
library(visdat) # visualizacion de datos como graficos
library(plotly) # graficos
library(purrr) # funcion map
library(plm) # modelos lineales para datos panel
library(car) # test y utilidaddes para modelos
Loading required package: carData
Attaching package: ‘car’
The following object is masked from ‘package:dplyr’:
recode
The following object is masked from ‘package:purrr’:
some
Obtener datos
Datos para paises bajos ingresos sean utilizados, segun clasificación
del banco mundial, hay 26 paises de bajos ingresos y 51 de ingresos
medios bajos
country_class <- read_excel("CLASS.xlsx")
country_class %>%
filter(!is.na(Region), !is.na(`Income group`)) %>%
group_by(`Income group`) %>%
summarise(countries = n()) %>%
arrange(factor(`Income group`, levels = c('High income', 'Upper middle income', 'Lower middle income', 'Low income')))
Listado de paises a analisar:
my_countries <- country_class %>%
filter(!is.na(Region), `Income group` %in% c('Low income', 'Lower middle income')) %>%
select(Code)
my_countries
Hacer la respectiva asociacion de nombres iso3c e iso2c
my_countries$iso2c <- WDI_data$country %>%
filter(iso3c %in% my_countries$Code) %>%
.$iso2c
my_countries
Datos del banco mundial (para ODA y los indices de gobernanza) y el
Human Development Reports API son descargados desde scripts de Python.
Son almacenados en archivos CSV y luego son cargados aqui:
HDI
datos_HDI <- read_csv("datos_python_HDI.csv", col_names = c('Code', 'iso2c', 'indicator', 'year', 'value'),
col_types = list(col_character(), col_character(), col_character(), col_double(), col_double()))
hdi_indicators <- datos_HDI %>% distinct(indicator) %>% .$indicator
ODA, GDP, POP.GROW
oda_indicators <- c(
'DT_ODA_ALLD_CD',
'DT_ODA_ALLD_KD',
'DT_ODA_OATL_CD',
'DT_ODA_OATL_KD',
'DT_ODA_ODAT_CD',
'DT_ODA_ODAT_GI_ZS',
'DT_ODA_ODAT_GN_ZS',
'DT_ODA_ODAT_KD',
'DT_ODA_ODAT_MP_ZS',
'DT_ODA_ODAT_PC_ZS',
'DT_ODA_ODAT_XP_ZS'
)
gob_indicators <- c(
'CC_EST',
'CC_NO_SRC',
'CC_PER_RNK',
'CC_PER_RNK_LOWER',
'CC_PER_RNK_UPPER',
'CC_STD_ERR',
'GE_EST',
'GE_NO_SRC',
'GE_PER_RNK',
'GE_PER_RNK_LOWER',
'GE_PER_RNK_UPPER',
'GE_STD_ERR',
'PV_EST',
'PV_NO_SRC',
'PV_PER_RNK',
'PV_PER_RNK_LOWER',
'PV_PER_RNK_UPPER',
'PV_STD_ERR',
'RQ_EST',
'RQ_NO_SRC',
'RQ_PER_RNK',
'RQ_PER_RNK_LOWER',
'RQ_PER_RNK_UPPER',
'RQ_STD_ERR',
'RL_EST',
'RL_NO_SRC',
'RL_PER_RNK',
'RL_PER_RNK_LOWER',
'RL_PER_RNK_UPPER',
'RL_STD_ERR',
'VA_EST',
'VA_NO_SRC',
'VA_PER_RNK',
'VA_PER_RNK_LOWER',
'VA_PER_RNK_UPPER',
'VA_STD_ERR'
)
gdp_indicators <- c(
'NY_ADJ_NNTY_PC_CD',
'NY_ADJ_NNTY_PC_KD',
'NY_ADJ_NNTY_PC_KD_ZG',
'NY_GDP_PCAP_CN',
'NY_GDP_PCAP_KN',
'NY_GDP_PCAP_CD',
'NY_GDP_PCAP_KD',
'NY_GDP_MKTP_KD_ZG',
'NY_GDP_DEFL_ZS_AD',
'NY_GDP_DEFL_ZS',
'NY_GDP_MKTP_CD',
'NY_GDP_MKTP_CN',
'NY_GDP_MKTP_KN',
'NY_GDP_MKTP_KD',
'NY_GDP_PCAP_KD_ZG',
'NY_GDP_PCAP_PP_KD',
'NY_GDP_PCAP_PP_CD',
'SL_GDP_PCAP_EM_KD',
'SP_POP_GROW'
)
datos_WB <- data.frame(indicator = character(), iso2c = character(), year = double(), value = double())
suppressWarnings(
for (indicator in c(oda_indicators, gob_indicators, gdp_indicators)) {
datos_WB <- rbind(datos_WB, read_csv(paste("datos_python", indicator, ".csv", sep =''),
col_names = c('indicator', 'iso2c', 'year', 'value'),
col_types = list(col_character(), col_character(), col_double(), col_double())))
}
)
Manipulacion de Datos
Transformar la estructura de los datos para una mejor comprension
datos_paper <- rbind(datos_WB, datos_HDI %>% select(indicator, iso2c, year, value)) %>%
pivot_wider(names_from = indicator, values_from = value)
Revisar que datos estan como faltantes
ODA
vis_dat(datos_paper %>% select(all_of(gsub("_", ".", oda_indicators))))

# DT.ODA.OATL.CD and DT.ODA.OATL.KD faltan
# DT.ODA.ODAT.GI.ZS, DT.ODA.ODAT.GN.ZS, DT.ODA.ODAT.MP.ZS and DT.ODA.ODAT.XP.ZS tienen faltas
# Un par de ocurrencias pais-año que faltan datos
GDP
vis_dat(datos_paper %>% select(NY.GDP.PCAP.CN, NY.GDP.PCAP.CD))

# NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, NY.GDP.MKTP.CD, NY.GDP.MKTP.CN son buenos candidatos para usar como variables,
# 'SY'falta PIB per Capita en 2022, 2023 sin datos algunos paises
GOV
vis_dat(datos_paper %>% arrange(year) %>% select(all_of(gsub("_", ".", gob_indicators))))

# Datos del 2000 para atras tienen espacios faltantes
HDI
vis_dat(datos_paper %>% select(all_of(hdi_indicators)))

# abr, co2_prod, le, le_f, le_m, mmr son las pocas categorias sin datos faltantes
# hdi faltante en multiples ocaciones
POP.GROW
vis_dat(datos_paper %>% arrange(iso2c) %>% select(SP.POP.GROW))

# ZW no tiene datos de crecimiento poblacional
Tomando en cuenta los datos faltantes, hacer filtros para seleccionar
una muestra mas pequeña
2001 - 2022
vis_dat(datos_paper %>%
filter(!iso2c %in% c('SS', 'ZW', 'BT', 'ER', 'GW', 'KP', 'LB', 'NG', 'PS', 'SO', 'VU', 'FM', 'KI', 'TL', 'CV', 'SB','SY'),
!year %in% c(1995, 1996, 1997, 1998, 1999, 2000, 2023)) %>%
select(iso2c, year, hdi, DT.ODA.ALLD.CD, DT.ODA.ALLD.KD, DT.ODA.ODAT.CD, DT.ODA.ODAT.KD, DT.ODA.ODAT.PC.ZS,
NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, SP.POP.GROW, all_of(gsub("_", ".", gob_indicators)),
))

2002 - 2002
vis_dat(datos_paper %>%
filter(!iso2c %in% c('SS', 'ZW', 'BT', 'ER', 'GW', 'KP', 'LB', 'NG', 'PS', 'SO', 'VU', 'FM', 'KI', 'TL', 'CV', 'SB','SY'),
!year %in% c(1995, 1996, 1997, 1998, 1999, 2000, 2001, 2023)) %>%
select(iso2c, year, hdi, DT.ODA.ALLD.CD, DT.ODA.ALLD.KD, DT.ODA.ODAT.CD, DT.ODA.ODAT.KD, DT.ODA.ODAT.PC.ZS,
NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, SP.POP.GROW, all_of(gsub("_", ".", gob_indicators)),
))

De 2232 observaciones reducimos a 1260 (2002 hasta 2022) o a 1320
(2001 hasta 2022)
Aplicar Operador diferencia
datos_model <- datos_paper %>%
filter(!iso2c %in% c('SS', 'ZW', 'BT', 'ER', 'GW', 'KP', 'LB', 'NG', 'PS', 'SO', 'VU', 'FM', 'KI', 'TL', 'CV', 'SB', 'SY'),
!year %in% c(1995, 1996, 1997, 1998, 1999, 2000, 2023)) %>%
select(iso2c, year, hdi, DT.ODA.ALLD.CD, DT.ODA.ALLD.KD, DT.ODA.ODAT.CD, DT.ODA.ODAT.KD, DT.ODA.ODAT.PC.ZS,
NY.GDP.PCAP.CN, NY.GDP.PCAP.CD, SP.POP.GROW, all_of(gsub("_", ".", gob_indicators))
)
datos_model <- datos_model %>% arrange(iso2c, year) %>%
mutate(hdi_diff = hdi - dplyr::lag(hdi),
NY.GDP.PCAP.CD_diff = NY.GDP.PCAP.CD - dplyr::lag(NY.GDP.PCAP.CD),
DT.ODA.ALLD.CD_diff = DT.ODA.ALLD.CD - dplyr::lag(DT.ODA.ALLD.CD),
DT.ODA.ODAT.PC.ZS_diff = DT.ODA.ODAT.PC.ZS - dplyr::lag(DT.ODA.ODAT.PC.ZS)) %>%
filter(!year %in% c(2001))
vis_dat(datos_model)

Modelos Regresion Lineal
Probando modelos sencillos, regresion lineal, Minimos cuadrados,
datos panel, HDI o GDP o sus differecias
vd <- c('hdi', 'hdi_diff', 'NY.GDP.PCAP.CD', 'NY.GDP.PCAP.CD_diff')
vi <- c('DT.ODA.ALLD.CD', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ODAT.PC.ZS_diff')
models <- list()
keys <- character()
for (vd_ in vd) {
for (vi_ in vi) {
key <- paste(vd_, vi_, sep = "~")
keys <- c(keys, key)
f <- paste(vd_, '~', vi_, '+ CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW')
models[[key]] <- lm(f, data=datos_model)
}
}
HDI
ODA.ALL
HDI = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[1]]])
# Todas las variables son significativas al 99% excepto Regulatory Quality
ODA.ALL_diff
HDI = ODA.ALL_diff + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[2]]])
# Todas las variables son significativas al 99% excepto ODA.ALL_diff y Regulatory Quality
ODA.PC
HDI = ODA.PC + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[3]]])
# Todas las variables son significativas al 99% excepto Regulatory Quality
ODA.PC_diff
HDI = ODA.PC_diff + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[4]]])
# Todas las variables son significativas al 99% excepto ODA.ALL_diff y Regulatory Quality
HDI_diff
ODA.ALL
HDI_diff = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[5]]])
# Todas las variables son significativas al 95% excepto ODA.ALL, Control of Corruption y Rule of Law
ODA.ALL_diff
HDI_diff = ODA.ALL_diff + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[6]]])
# Todas las variables son significativas al 95% excepto Control of Corruption y Voice and Accountability
ODA.PC
HDI_diff = ODA.PC + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[7]]])
# Todas las variables son significativas al 95% excepto Rule of Law y Voice and Accountability
ODA.PC_diff
HDI_diff = ODA.PC_diff + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[8]]])
# Todas las variables son significativas al 95% excepto Control of Corruption y Voice and Accountability
GPD.PC
ODA.ALL
GPD.PC = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[9]]])
# Todas las variables son significativas al 99% excepto ODA.ALL, Control of Corruption, Regulatory Quality y Rule of Law
ODA.ALL_diff
GPD.PC = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[10]]])
# Todas las variables son significativas al 99% excepto ODA.ALL_diff, Control of Corruption, Regulatory Quality y Rule of Law
ODA.PC
GPD.PC = ODA.PC + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[11]]])
# Todas las variables son significativas al 99% excepto Rule of Law
ODA.PC_diff
GPD.PC = ODA.PC_diff + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[12]]])
# Todas las variables son significativas al 99% excepto ODA.ALL_diff, Control of Corruption, Regulatory Quality y Rule of Law
GPD.PC_diff
ODA.ALL
GPD.PC_diff = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[13]]])
# Todas las variables son significativas al 95% excepto ODA.ALL, Control of Corruption, Regulatory Quality y Voice and Accountability
ODA.ALL_diff
GPD.PC_diff = ODA.ALL + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[14]]])
# Todas las variables son significativas al 95% excepto ODA.ALL_diff, Control of Corruption, Regulatory Quality y Voice and Accountability
ODA.PC
GPD.PC_diff = ODA.PC + CC + GE + PV + RQ + RL + VA + POP.GROW
summary(models[[keys[15]]])
# Todas las variables son significativas al 95% excepto ODA.PC, Control of Corruption, Political Stability, Regulatory Quality y Voice and Accountability
ODA.PC_diff
GPD.PC_diff = ODA.PC_diff + CC + GE + PV + RQ + RL + VA +
POP.GROW
summary(models[[keys[16]]])
# Todas las variables son significativas al 95% excepto ODA.PC_diff, Control of Corruption, Regulatory Quality y Voice and Accountability
Se revisara las relaciones entre las variables graficamente
Visualizacion de datos
HDI
my_plot <- list()
for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff',
'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['hdi']], type = 'scatter', mode = 'markers', name = col)
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'HDI vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'HDI vs GOB')
HDI diff
my_plot <- list()
for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff',
'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['hdi_diff']], type = 'scatter', mode = 'markers', name = col)
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'HDI diff vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'HDI diff vs GOB')
GPD.PC
my_plot <- list()
for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff',
'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['NY.GDP.PCAP.CD']],
type = 'scatter', mode = 'markers', name = col)
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC vs GOB')
NA
GPD.PC diff
my_plot <- list()
for (col in c('DT.ODA.ALLD.CD', 'DT.ODA.ODAT.PC.ZS', 'DT.ODA.ALLD.CD_diff', 'DT.ODA.ODAT.PC.ZS_diff',
'CC.EST', 'GE.EST', 'PV.EST', 'RQ.EST', 'RL.EST', 'VA.EST')) {
my_plot[[col]] <- plot_ly(x = datos_model[[col]], y = datos_model[['NY.GDP.PCAP.CD_diff']], type = 'scatter', mode = 'markers', name = col)
}
subplot(my_plot[1:4], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC diff vs ODA')
subplot(my_plot[5:10], nrows = 2, margin = 0.05) %>% layout(title = 'GDP.PC diff vs GOB')
NA
No se ve una relacion clara, hay tanto paises con punteos altos y
bajos de GOB que tienen tanto HID altos o bajos Quiza puede verse una
leve relacion de mayor punteo en GOB acompañado de mejor punteo den HDI
Los datos de GPD si muestran una relacion positiva con el HDI visto en
las graficas
Se realizara el mismo proceso con el crecimiento o decrecimiento de
HDI anual
Visualizacion de Datos historia
Viendo la historia de las variables en el tiempo (por pais)
datos_model %>% filter(iso2c == 'AF') %>% plot_ly(x = ~year) %>%
add_trace(y = ~hdi, type = 'scatter', mode = 'lines+markers', name = 'hdi') %>%
add_trace(y = ~NY.GDP.PCAP.CD / 1000, type = 'scatter', mode = 'lines+markers', name = 'gdp.pc') %>%
add_trace(y = ~DT.ODA.ALLD.CD / 10000000000, type = 'scatter', mode = 'lines+markers', name = 'ODA.ALL') %>%
add_trace(y = ~DT.ODA.ODAT.PC.ZS / 1000, type = 'scatter', mode = 'lines+markers', name = 'ODA.PC') %>%
add_trace(y = ~CC.EST, type = 'scatter', mode = 'lines+markers', name = 'CC') %>%
add_trace(y = ~GE.EST, type = 'scatter', mode = 'lines+markers', name = 'GE') %>%
add_trace(y = ~PV.EST, type = 'scatter', mode = 'lines+markers', name = 'PV') %>%
add_trace(y = ~RQ.EST, type = 'scatter', mode = 'lines+markers', name = 'RQ') %>%
add_trace(y = ~RL.EST, type = 'scatter', mode = 'lines+markers', name = 'RL') %>%
add_trace(y = ~VA.EST, type = 'scatter', mode = 'lines+markers', name = 'VA')
Modelos Efectos fijos
HDI ~ ODA.ALL
plm(hdi ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
index = c("iso2c", "year"), model = "within")
Model Formula: hdi ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST +
VA.EST + SP.POP.GROW
Coefficients:
DT.ODA.ALLD.CD CC.EST GE.EST PV.EST RQ.EST RL.EST VA.EST SP.POP.GROW
2.0890e-11 -8.3315e-03 7.5391e-03 -4.4617e-03 2.0938e-02 3.2560e-02 6.9264e-03 -5.5903e-03
# summary(lm(hdi ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW + iso2c, data=datos_model))
# Corruption Control, Government Effectiveness, Political Stability y Voice and Accountability no son significativas
HDI ~ ODA.PC
plm(hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
index = c("iso2c", "year"), model = "within")
Model Formula: hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST +
RL.EST + VA.EST + SP.POP.GROW
Coefficients:
DT.ODA.ODAT.PC.ZS CC.EST GE.EST PV.EST RQ.EST RL.EST VA.EST
0.0001890 -0.0090492 -0.0012169 -0.0066846 0.0225845 0.0433849 0.0048044
SP.POP.GROW
-0.0089386
#summary(lm(hdi ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW + iso2c, data=datos_model))
# Corruption Control, Government Effectiveness y Voice and Accountability no son significativas
GDP.PC ~ ODA.ALL
plm(NY.GDP.PCAP.CD ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
index = c("iso2c", "year"), model = "within")
Model Formula: NY.GDP.PCAP.CD ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST +
RQ.EST + RL.EST + VA.EST + SP.POP.GROW
Coefficients:
DT.ODA.ALLD.CD CC.EST GE.EST PV.EST RQ.EST RL.EST VA.EST SP.POP.GROW
2.6336e-07 -2.1804e+01 4.6280e+02 1.9040e+02 -5.2602e+01 -1.6883e+02 -2.6173e+01 -3.7759e+01
#summary(lm(NY.GDP.PCAP.CD ~ DT.ODA.ALLD.CD + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW + iso2c, data=datos_model))
# Intercepto, Corruption Control, Regulatory Quality, Rule of Law, Voice and Accountability y Population Growth no son significativas
GDP.PC ~ ODA.PC
plm(NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW, data=datos_model,
index = c("iso2c", "year"), model = "within")
Model Formula: NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST +
RQ.EST + RL.EST + VA.EST + SP.POP.GROW
Coefficients:
DT.ODA.ODAT.PC.ZS CC.EST GE.EST PV.EST RQ.EST RL.EST VA.EST
3.6490 -82.8703 370.2174 156.9927 -13.5138 -2.0353 -66.6104
SP.POP.GROW
-85.1696
#summary(lm(NY.GDP.PCAP.CD ~ DT.ODA.ODAT.PC.ZS + CC.EST + GE.EST + PV.EST + RQ.EST + RL.EST + VA.EST + SP.POP.GROW + iso2c, data=datos_model))
# Corruption Control, Regulatory Quality, Rule of Law y Voice and Accountability no son significativas
LS0tDQp0aXRsZTogIk9mZmljaWFsIERldmVsb3BtZW50IEFzc2lzdGFuY2UgYW5kIEluc3RpdHV0aW9uYWwgUXVhbGl0eSBvbiBVbmRldmVsb3BlZCBjb3VudHJpZXMiDQphdXRob3I6ICJPc2NhciBFZHVhcmRvIE1vcmFsZXMgQ8OhcmRlbmFzIg0KZGF0ZTogIjIwMjQtMDgtMDUiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KSW50ZXJuYXRpb25hbCBhaWQgbWF5IHRha2UgdGhlIGZvcm0gb2YgbXVsdGlsYXRlcmFsIGFpZCAtLSBwcm92aWRlZCB0aHJvdWdoIGludGVybmF0aW9uYWwgYm9kaWVzIHN1Y2ggYXMgdGhlIFVOLCBvciBOR09zIHN1Y2ggYXMgT3hmYW0gLS0gb3IgYmlsYXRlcmFsIGFpZCwgd2hpY2ggb3BlcmF0ZXMgb24gYSBnb3Zlcm5tZW50LXRvLWdvdmVybm1lbnQgYmFzaXMuIFRoZXJlIGlzIGNvbnNpZGVyYWJsZSBkZWJhdGUgYWJvdXQgd2hldGhlciBpbnRlcm5hdGlvbmFsIGFpZCB3b3JrcywgaW4gdGhlIHNlbnNlIG9mIHJlZHVjaW5nIHBvdmVydHkgYW5kIHN0aW11bGF0aW5nIGRldmVsb3BtZW50Lg0KDQpIb3dldmVyLCB0aGUgZWZmZWN0aXZlbmVzcyBvZiBhaWQgaXMgb2Z0ZW4gZGlsdXRlZCBieSBjb3JydXB0aW9uLiBBaWQgaXMgaW52YXJpYWJseSBjaGFubmVsZWQgdGhyb3VnaCB0aGUgZ292ZXJubWVudHMgb2YgcmVjaXBpZW50IGNvdW50cmllcywgaW4gd2hpY2ggcG93ZXIgaXMgb2Z0ZW4gY29uY2VudHJhdGVkIGluIHRoZSBoYW5kcyBvZiBhIGZldyBwb2xpdGljaWFucyBhbmQgYnVyZWF1Y3JhdHMsIGFuZCB0aGUgbWVjaGFuaXNtcyBvZiBhY2NvdW50YWJpbGl0eSBhcmUsIGF0IGJlc3QsIHBvb3JseSBkZXZlbG9wZWQuIFRoaXMgdGVuZHMgdG8gYmVuZWZpdCBjb3JydXB0IGxlYWRlcnMgYW5kIGVsaXRlcyByYXRoZXIgdGhhbiB0aGUgcGVvcGxlLCBwcm9qZWN0cyBhbmQgcHJvZ3JhbXMgZm9yIHdoaWNoIGl0IHdhcyBpbnRlbmRlZC4NCg0KXHRleHRiZntXYXR0cywgQ2FybC4gKDIwMTQpLiBSZTogRG9lcyBmb3JlaWduIGFpZCBoZWxwIHRoZSBkZXZlbG9waW5nIGNvdW50cmllcyB0b3dhcmRzIGRldmVsb3BtZW50Py4gUmV0cmlldmVkIGZyb206ICRodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3Bvc3QvRG9lc19mb3JlaWduX2FpZF9oZWxwX3RoZV9kZXZlbG9waW5nX2NvdW50cmllc190b3dhcmRzX2RldmVsb3BtZW50LzUzMjIwMDVlZDAzOWIxZTc2NDhiNDU5Yy9jaXRhdGlvbi9kb3dubG9hZC4kfQ0KDQpUaGUgaHlwb3RoZXNpcyB0aGF0IGZvcmVpZ24gYWlkIGNhbiBwcm9tb3RlIGdyb3d0aCBpbiBkZXZlbG9waW5nIGNvdW50cmllcyB3YXMgZXhwbG9yZWQsIHVzaW5nIHBhbmVsIGRhdGEgc2VyaWVzIGZvciBmb3JlaWduIGFpZCwgd2hpbGUgYWNjb3VudGluZyBmb3IgcmVnaW9uYWwgZGlmZmVyZW5jZXMgaW4gQXNpYW4sIEFmcmljYW4sIExhdGluIEFtZXJpY2FuLCBhbmQgdGhlIENhcmliYmVhbiBjb3VudHJpZXMgYXMgd2VsbCBhcyB0aGUgZGlmZmVyZW5jZXMgaW4gaW5jb21lIGxldmVscywgdGhlIHJlc3VsdHMgb2YgdGhpcyBzdHVkeSBhbHNvIGluZGljYXRlIHRoYXQgZm9yZWlnbiBhaWQgaGFzIG1peGVkIGVmZmVjdHMgb24gZWNvbm9taWMgZ3Jvd3RoIGluIGRldmVsb3BpbmcgY291bnRyaWVzLg0KDQpcdGV4dGJme0VrYW5heWFrZSwgRS4gJiBDaGF0cm5hLCBEYXNoYS4gKDIwMTApLiBUaGUgZWZmZWN0IG9mIGZvcmVpZ24gYWlkIG9uIGVjb25vbWljIGdyb3d0aCBpbiBkZXZlbG9waW5nIGNvdW50cmllcy4gSm91cm5hbCBvZiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIGFuZCBDdWx0dXJhbCBTdHVkaWVzLiAzLn0NCg0KVGhpcyBzdHVkeSBleGFtaW5lcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZvcmVpZ24gYWlkLCBpbnN0aXR1dGlvbmFsIHN0cnVjdHVyZSwgYW5kIGVjb25vbWljIHBlcmZvcm1hbmNlIGZvciA4MCBjb3VudHJpZXMgaW4gRXVyb3BlLCBBbWVyaWNhLCBBZnJpY2EsIGFuZCBBc2lhLiBJdCBpcyBmb3VuZCB0aGF0IG9mZmljaWFsIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgYW5kIHRoZSBxdWFsaXR5IG9mIGluc3RpdHV0aW9uYWwgc3RydWN0dXJlIGluIHRoZSBzYW1wbGUgY291bnRyaWVzIGFmZmVjdCBlY29ub21pYyBncm93dGggcG9zaXRpdmVseS4NCg0KXHRleHRiZntIYXlhbG/En2x1LCBQxLFuYXIuICgyMDIzKS4gRm9yZWlnbiBBaWQsIEluc3RpdHV0aW9ucywgYW5kIEVjb25vbWljIFBlcmZvcm1hbmNlIGluIERldmVsb3BpbmcgQ291bnRyaWVzLiBFc2tpxZ9laGlyIE9zbWFuZ2F6aSDDnG5pdmVyc2l0ZXNpIMSwa3Rpc2FkaSB2ZSDEsGRhcmkgQmlsaW1sZXIgRGVyZ2lzaS4gMTguIDc0OC03NjUuIDEwLjE3MTUzL29ndWlpYmYuMTI3NzM0OC59DQoNCiMgQ2FyZ2FuZG8gTGlicmVyaWFzDQoNCkFsZ3VuYXMgbGlicmVyaWFzIHkgcGFxdWV0ZXMgdXNhZG9zIHBhcmEgb2J0ZW5lciB5IGRlc2NhcmdhciBsb3MgZGF0b3MNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBtYW5lam8gZGUgZGF0YWZyYW1lcw0KbGlicmFyeShXREkpICAgICAgICMgbGlicmVyaWEgcGFyYSBhY2NlZGVyIGEgbWV0YWRhdGEgZGUgYmFuY28gbXVuZGlhbA0KbGlicmFyeShyZWFkeGwpICAgICMgbGVlciBhcmNoaXZvcyBkZSBleGNlbA0KbGlicmFyeShyZWFkcikgICAgICMgbGVlciBhcmNoaXZvcyBjc3YNCmxpYnJhcnkodmlzZGF0KSAgICAjIHZpc3VhbGl6YWNpb24gZGUgZGF0b3MgY29tbyBncmFmaWNvcw0KbGlicmFyeShwbG90bHkpICAgICMgZ3JhZmljb3MNCmxpYnJhcnkocHVycnIpICAgICAjIGZ1bmNpb24gbWFwDQpsaWJyYXJ5KHBsbSkgICAgICAgIyBtb2RlbG9zIGxpbmVhbGVzIHBhcmEgZGF0b3MgcGFuZWwNCmxpYnJhcnkoY2FyKSAgICAgICAjIHRlc3QgeSB1dGlsaWRhZGRlcyBwYXJhIG1vZGVsb3MNCmBgYA0KDQojIE9idGVuZXIgZGF0b3MNCg0KRGF0b3MgcGFyYSBwYWlzZXMgYmFqb3MgaW5ncmVzb3Mgc2VhbiB1dGlsaXphZG9zLCBzZWd1biBjbGFzaWZpY2FjacOzbiBkZWwgYmFuY28gbXVuZGlhbCwgaGF5IDI2IHBhaXNlcyBkZSBiYWpvcyBpbmdyZXNvcyB5IDUxIGRlIGluZ3Jlc29zIG1lZGlvcyBiYWpvcw0KDQpgYGB7cn0NCmNvdW50cnlfY2xhc3MgPC0gcmVhZF9leGNlbCgiQ0xBU1MueGxzeCIpDQoNCmNvdW50cnlfY2xhc3MgJT4lDQogIGZpbHRlcighaXMubmEoUmVnaW9uKSwgIWlzLm5hKGBJbmNvbWUgZ3JvdXBgKSkgJT4lDQogIGdyb3VwX2J5KGBJbmNvbWUgZ3JvdXBgKSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50cmllcyA9IG4oKSkgJT4lDQogIGFycmFuZ2UoZmFjdG9yKGBJbmNvbWUgZ3JvdXBgLCBsZXZlbHMgPSBjKCdIaWdoIGluY29tZScsICdVcHBlciBtaWRkbGUgaW5jb21lJywgJ0xvd2VyIG1pZGRsZSBpbmNvbWUnLCAnTG93IGluY29tZScpKSkNCmBgYA0KDQpMaXN0YWRvIGRlIHBhaXNlcyBhIGFuYWxpc2FyOg0KDQpgYGB7cn0NCm15X2NvdW50cmllcyA8LSBjb3VudHJ5X2NsYXNzICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFJlZ2lvbiksIGBJbmNvbWUgZ3JvdXBgICVpbiUgYygnTG93IGluY29tZScsICdMb3dlciBtaWRkbGUgaW5jb21lJykpICU+JQ0KICBzZWxlY3QoQ29kZSkNCm15X2NvdW50cmllcw0KYGBgDQoNCkhhY2VyIGxhIHJlc3BlY3RpdmEgYXNvY2lhY2lvbiBkZSBub21icmVzIGlzbzNjIGUgaXNvMmMNCg0KYGBge3J9DQpteV9jb3VudHJpZXMkaXNvMmMgPC0gV0RJX2RhdGEkY291bnRyeSAlPiUNCiAgZmlsdGVyKGlzbzNjICVpbiUgbXlfY291bnRyaWVzJENvZGUpICU+JQ0KICAuJGlzbzJjDQpteV9jb3VudHJpZXMNCmBgYA0KDQpEYXRvcyBkZWwgYmFuY28gbXVuZGlhbCAocGFyYSBPREEgeSBsb3MgaW5kaWNlcyBkZSBnb2Jlcm5hbnphKSB5IGVsIEh1bWFuIERldmVsb3BtZW50IFJlcG9ydHMgQVBJIHNvbiBkZXNjYXJnYWRvcyBkZXNkZSBzY3JpcHRzIGRlIFB5dGhvbi4gU29uIGFsbWFjZW5hZG9zIGVuIGFyY2hpdm9zIENTViB5IGx1ZWdvIHNvbiBjYXJnYWRvcyBhcXVpOg0KDQojIyBIREkNCg0KYGBge3J9DQpkYXRvc19IREkgPC0gcmVhZF9jc3YoImRhdG9zX3B5dGhvbl9IREkuY3N2IiwgY29sX25hbWVzID0gYygnQ29kZScsICdpc28yYycsICdpbmRpY2F0b3InLCAneWVhcicsICd2YWx1ZScpLCANCiAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBsaXN0KGNvbF9jaGFyYWN0ZXIoKSwgY29sX2NoYXJhY3RlcigpLCBjb2xfY2hhcmFjdGVyKCksIGNvbF9kb3VibGUoKSwgY29sX2RvdWJsZSgpKSkNCg0KaGRpX2luZGljYXRvcnMgPC0gZGF0b3NfSERJICU+JSBkaXN0aW5jdChpbmRpY2F0b3IpICU+JSAuJGluZGljYXRvcg0KYGBgDQoNCiMjIE9EQSwgR0RQLCBQT1AuR1JPVw0KDQpgYGB7cn0NCm9kYV9pbmRpY2F0b3JzIDwtIGMoDQonRFRfT0RBX0FMTERfQ0QnLA0KJ0RUX09EQV9BTExEX0tEJywNCidEVF9PREFfT0FUTF9DRCcsDQonRFRfT0RBX09BVExfS0QnLA0KJ0RUX09EQV9PREFUX0NEJywNCidEVF9PREFfT0RBVF9HSV9aUycsDQonRFRfT0RBX09EQVRfR05fWlMnLA0KJ0RUX09EQV9PREFUX0tEJywNCidEVF9PREFfT0RBVF9NUF9aUycsDQonRFRfT0RBX09EQVRfUENfWlMnLA0KJ0RUX09EQV9PREFUX1hQX1pTJw0KKQ0KZ29iX2luZGljYXRvcnMgPC0gYygNCidDQ19FU1QnLA0KJ0NDX05PX1NSQycsDQonQ0NfUEVSX1JOSycsDQonQ0NfUEVSX1JOS19MT1dFUicsDQonQ0NfUEVSX1JOS19VUFBFUicsDQonQ0NfU1REX0VSUicsDQonR0VfRVNUJywNCidHRV9OT19TUkMnLA0KJ0dFX1BFUl9STksnLA0KJ0dFX1BFUl9STktfTE9XRVInLA0KJ0dFX1BFUl9STktfVVBQRVInLA0KJ0dFX1NURF9FUlInLA0KJ1BWX0VTVCcsDQonUFZfTk9fU1JDJywNCidQVl9QRVJfUk5LJywNCidQVl9QRVJfUk5LX0xPV0VSJywNCidQVl9QRVJfUk5LX1VQUEVSJywNCidQVl9TVERfRVJSJywNCidSUV9FU1QnLA0KJ1JRX05PX1NSQycsDQonUlFfUEVSX1JOSycsDQonUlFfUEVSX1JOS19MT1dFUicsDQonUlFfUEVSX1JOS19VUFBFUicsDQonUlFfU1REX0VSUicsDQonUkxfRVNUJywNCidSTF9OT19TUkMnLA0KJ1JMX1BFUl9STksnLA0KJ1JMX1BFUl9STktfTE9XRVInLA0KJ1JMX1BFUl9STktfVVBQRVInLA0KJ1JMX1NURF9FUlInLA0KJ1ZBX0VTVCcsDQonVkFfTk9fU1JDJywNCidWQV9QRVJfUk5LJywNCidWQV9QRVJfUk5LX0xPV0VSJywNCidWQV9QRVJfUk5LX1VQUEVSJywNCidWQV9TVERfRVJSJw0KKQ0KZ2RwX2luZGljYXRvcnMgPC0gYygNCidOWV9BREpfTk5UWV9QQ19DRCcsDQonTllfQURKX05OVFlfUENfS0QnLA0KJ05ZX0FESl9OTlRZX1BDX0tEX1pHJywNCidOWV9HRFBfUENBUF9DTicsDQonTllfR0RQX1BDQVBfS04nLA0KJ05ZX0dEUF9QQ0FQX0NEJywNCidOWV9HRFBfUENBUF9LRCcsDQonTllfR0RQX01LVFBfS0RfWkcnLA0KJ05ZX0dEUF9ERUZMX1pTX0FEJywNCidOWV9HRFBfREVGTF9aUycsDQonTllfR0RQX01LVFBfQ0QnLA0KJ05ZX0dEUF9NS1RQX0NOJywNCidOWV9HRFBfTUtUUF9LTicsDQonTllfR0RQX01LVFBfS0QnLA0KJ05ZX0dEUF9QQ0FQX0tEX1pHJywNCidOWV9HRFBfUENBUF9QUF9LRCcsDQonTllfR0RQX1BDQVBfUFBfQ0QnLA0KJ1NMX0dEUF9QQ0FQX0VNX0tEJywNCidTUF9QT1BfR1JPVycNCikNCg0KZGF0b3NfV0IgPC0gZGF0YS5mcmFtZShpbmRpY2F0b3IgPSBjaGFyYWN0ZXIoKSwgaXNvMmMgPSBjaGFyYWN0ZXIoKSwgeWVhciA9IGRvdWJsZSgpLCB2YWx1ZSA9IGRvdWJsZSgpKQ0KDQpzdXBwcmVzc1dhcm5pbmdzKA0KICBmb3IgKGluZGljYXRvciBpbiBjKG9kYV9pbmRpY2F0b3JzLCBnb2JfaW5kaWNhdG9ycywgZ2RwX2luZGljYXRvcnMpKSB7DQogICAgZGF0b3NfV0IgPC0gcmJpbmQoZGF0b3NfV0IsIHJlYWRfY3N2KHBhc3RlKCJkYXRvc19weXRob24iLCBpbmRpY2F0b3IsICIuY3N2Iiwgc2VwID0nJyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoJ2luZGljYXRvcicsICdpc28yYycsICd5ZWFyJywgJ3ZhbHVlJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gbGlzdChjb2xfY2hhcmFjdGVyKCksIGNvbF9jaGFyYWN0ZXIoKSwgY29sX2RvdWJsZSgpLCBjb2xfZG91YmxlKCkpKSkNCiAgfQ0KKQ0KYGBgDQoNCiMgTWFuaXB1bGFjaW9uIGRlIERhdG9zIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KVHJhbnNmb3JtYXIgbGEgZXN0cnVjdHVyYSBkZSBsb3MgZGF0b3MgcGFyYSB1bmEgbWVqb3IgY29tcHJlbnNpb24NCg0KYGBge3J9DQpkYXRvc19wYXBlciA8LSByYmluZChkYXRvc19XQiwgZGF0b3NfSERJICU+JSBzZWxlY3QoaW5kaWNhdG9yLCBpc28yYywgeWVhciwgdmFsdWUpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGluZGljYXRvciwgdmFsdWVzX2Zyb20gPSB2YWx1ZSkNCmBgYA0KDQpSZXZpc2FyIHF1ZSBkYXRvcyBlc3RhbiBjb21vIGZhbHRhbnRlcw0KDQojIyBPREENCg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSBzZWxlY3QoYWxsX29mKGdzdWIoIl8iLCAiLiIsIG9kYV9pbmRpY2F0b3JzKSkpKSANCiAgIyBEVC5PREEuT0FUTC5DRCBhbmQgRFQuT0RBLk9BVEwuS0QgZmFsdGFuDQogICMgRFQuT0RBLk9EQVQuR0kuWlMsIERULk9EQS5PREFULkdOLlpTLCBEVC5PREEuT0RBVC5NUC5aUyBhbmQgRFQuT0RBLk9EQVQuWFAuWlMgdGllbmVuIGZhbHRhcw0KICAjIFVuIHBhciBkZSBvY3VycmVuY2lhcyBwYWlzLWHDsW8gcXVlIGZhbHRhbiBkYXRvcw0KYGBgDQoNCiMjIA0KDQojIyBHRFANCg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSBzZWxlY3QoTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNEKSkgDQogICMgTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNELCBOWS5HRFAuTUtUUC5DRCwgTlkuR0RQLk1LVFAuQ04gc29uIGJ1ZW5vcyBjYW5kaWRhdG9zIHBhcmEgdXNhciBjb21vIHZhcmlhYmxlcywgDQogICMgJ1NZJ2ZhbHRhIFBJQiBwZXIgQ2FwaXRhIGVuIDIwMjIsIDIwMjMgc2luIGRhdG9zIGFsZ3Vub3MgcGFpc2VzDQpgYGANCg0KIyMgDQoNCiMjIEdPVg0KDQpgYGB7cn0NCnZpc19kYXQoZGF0b3NfcGFwZXIgJT4lIGFycmFuZ2UoeWVhcikgJT4lIHNlbGVjdChhbGxfb2YoZ3N1YigiXyIsICIuIiwgZ29iX2luZGljYXRvcnMpKSkpIA0KICAjIERhdG9zIGRlbCAyMDAwIHBhcmEgYXRyYXMgdGllbmVuIGVzcGFjaW9zIGZhbHRhbnRlcyANCmBgYA0KDQojIyANCg0KIyMgSERJDQoNCmBgYHtyfQ0KdmlzX2RhdChkYXRvc19wYXBlciAlPiUgc2VsZWN0KGFsbF9vZihoZGlfaW5kaWNhdG9ycykpKSANCiAgIyBhYnIsIGNvMl9wcm9kLCBsZSwgbGVfZiwgbGVfbSwgbW1yIHNvbiBsYXMgcG9jYXMgY2F0ZWdvcmlhcyBzaW4gZGF0b3MgZmFsdGFudGVzDQogICMgaGRpIGZhbHRhbnRlIGVuIG11bHRpcGxlcyBvY2FjaW9uZXMNCmBgYA0KDQojIyANCg0KIyMgUE9QLkdST1cNCg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSBhcnJhbmdlKGlzbzJjKSAlPiUgc2VsZWN0KFNQLlBPUC5HUk9XKSkgDQogICMgWlcgbm8gdGllbmUgZGF0b3MgZGUgY3JlY2ltaWVudG8gcG9ibGFjaW9uYWwNCg0KYGBgDQojIw0KDQpUb21hbmRvIGVuIGN1ZW50YSBsb3MgZGF0b3MgZmFsdGFudGVzLCBoYWNlciBmaWx0cm9zIHBhcmEgc2VsZWNjaW9uYXIgdW5hIG11ZXN0cmEgbWFzIHBlcXVlw7FhDQoNCiMjIDIwMDEgLSAyMDIyDQpgYGB7cn0NCnZpc19kYXQoZGF0b3NfcGFwZXIgJT4lIA0KICAgICAgICBmaWx0ZXIoIWlzbzJjICVpbiUgYygnU1MnLCAnWlcnLCAnQlQnLCAnRVInLCAnR1cnLCAnS1AnLCAnTEInLCAnTkcnLCAnUFMnLCAnU08nLCAnVlUnLCAnRk0nLCAnS0knLCAnVEwnLCAnQ1YnLCAnU0InLCdTWScpLA0KICAgICAgICAgICAgICAgIXllYXIgJWluJSBjKDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMjMpKSAlPiUNCiAgICAgICAgc2VsZWN0KGlzbzJjLCB5ZWFyLCBoZGksIERULk9EQS5BTExELkNELCBEVC5PREEuQUxMRC5LRCwgRFQuT0RBLk9EQVQuQ0QsIERULk9EQS5PREFULktELCBEVC5PREEuT0RBVC5QQy5aUywgDQogICAgICAgICAgICAgICBOWS5HRFAuUENBUC5DTiwgTlkuR0RQLlBDQVAuQ0QsIFNQLlBPUC5HUk9XLCBhbGxfb2YoZ3N1YigiXyIsICIuIiwgZ29iX2luZGljYXRvcnMpKSwgDQogICAgICAgICAgICAgICApKQ0KYGBgDQojIw0KDQojIyAyMDAyIC0gMjAwMg0KYGBge3J9DQp2aXNfZGF0KGRhdG9zX3BhcGVyICU+JSANCiAgICAgICAgZmlsdGVyKCFpc28yYyAlaW4lIGMoJ1NTJywgJ1pXJywgJ0JUJywgJ0VSJywgJ0dXJywgJ0tQJywgJ0xCJywgJ05HJywgJ1BTJywgJ1NPJywgJ1ZVJywgJ0ZNJywgJ0tJJywgJ1RMJywgJ0NWJywgJ1NCJywnU1knKSwNCiAgICAgICAgICAgICAgICF5ZWFyICVpbiUgYygxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDIzKSkgJT4lDQogICAgICAgIHNlbGVjdChpc28yYywgeWVhciwgaGRpLCBEVC5PREEuQUxMRC5DRCwgRFQuT0RBLkFMTEQuS0QsIERULk9EQS5PREFULkNELCBEVC5PREEuT0RBVC5LRCwgRFQuT0RBLk9EQVQuUEMuWlMsIA0KICAgICAgICAgICAgICAgTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNELCBTUC5QT1AuR1JPVywgYWxsX29mKGdzdWIoIl8iLCAiLiIsIGdvYl9pbmRpY2F0b3JzKSksIA0KICAgICAgICAgICAgICAgKSkNCmBgYA0KIyMNCg0KRGUgMjIzMiBvYnNlcnZhY2lvbmVzIHJlZHVjaW1vcyBhIDEyNjAgKDIwMDIgaGFzdGEgMjAyMikgbyBhIDEzMjAgKDIwMDEgaGFzdGEgMjAyMikNCg0KQXBsaWNhciBPcGVyYWRvciBkaWZlcmVuY2lhDQoNCmBgYHtyfQ0KZGF0b3NfbW9kZWwgPC0gZGF0b3NfcGFwZXIgJT4lIA0KICAgICAgICBmaWx0ZXIoIWlzbzJjICVpbiUgYygnU1MnLCAnWlcnLCAnQlQnLCAnRVInLCAnR1cnLCAnS1AnLCAnTEInLCAnTkcnLCAnUFMnLCAnU08nLCAnVlUnLCAnRk0nLCAnS0knLCAnVEwnLCAnQ1YnLCAnU0InLCAnU1knKSwNCiAgICAgICAgICAgICAgICF5ZWFyICVpbiUgYygxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDIzKSkgJT4lDQogICAgICAgIHNlbGVjdChpc28yYywgeWVhciwgaGRpLCBEVC5PREEuQUxMRC5DRCwgRFQuT0RBLkFMTEQuS0QsIERULk9EQS5PREFULkNELCBEVC5PREEuT0RBVC5LRCwgRFQuT0RBLk9EQVQuUEMuWlMsIA0KICAgICAgICAgICAgICAgTlkuR0RQLlBDQVAuQ04sIE5ZLkdEUC5QQ0FQLkNELCBTUC5QT1AuR1JPVywgYWxsX29mKGdzdWIoIl8iLCAiLiIsIGdvYl9pbmRpY2F0b3JzKSkNCiAgICAgICAgICAgICAgICkNCg0KZGF0b3NfbW9kZWwgPC0gZGF0b3NfbW9kZWwgJT4lIGFycmFuZ2UoaXNvMmMsIHllYXIpICU+JSANCiAgICAgICAgbXV0YXRlKGhkaV9kaWZmID0gaGRpIC0gZHBseXI6OmxhZyhoZGkpLCANCiAgICAgICAgICAgICAgIE5ZLkdEUC5QQ0FQLkNEX2RpZmYgPSBOWS5HRFAuUENBUC5DRCAtIGRwbHlyOjpsYWcoTlkuR0RQLlBDQVAuQ0QpLA0KICAgICAgICAgICAgICAgRFQuT0RBLkFMTEQuQ0RfZGlmZiA9IERULk9EQS5BTExELkNEIC0gZHBseXI6OmxhZyhEVC5PREEuQUxMRC5DRCksDQogICAgICAgICAgICAgICBEVC5PREEuT0RBVC5QQy5aU19kaWZmID0gRFQuT0RBLk9EQVQuUEMuWlMgLSBkcGx5cjo6bGFnKERULk9EQS5PREFULlBDLlpTKSkgJT4lDQogICAgICAgIGZpbHRlcigheWVhciAlaW4lIGMoMjAwMSkpDQoNCnZpc19kYXQoZGF0b3NfbW9kZWwpDQoNCmBgYA0KDQojIE1vZGVsb3MgUmVncmVzaW9uIExpbmVhbCB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNClByb2JhbmRvIG1vZGVsb3Mgc2VuY2lsbG9zLCByZWdyZXNpb24gbGluZWFsLCBNaW5pbW9zIGN1YWRyYWRvcywgZGF0b3MgcGFuZWwsIEhESSBvIEdEUCBvIHN1cyBkaWZmZXJlY2lhcw0KYGBge3J9DQp2ZCA8LSBjKCdoZGknLCAnaGRpX2RpZmYnLCAnTlkuR0RQLlBDQVAuQ0QnLCAnTlkuR0RQLlBDQVAuQ0RfZGlmZicpDQp2aSA8LSBjKCdEVC5PREEuQUxMRC5DRCcsICdEVC5PREEuQUxMRC5DRF9kaWZmJywgJ0RULk9EQS5PREFULlBDLlpTJywgJ0RULk9EQS5PREFULlBDLlpTX2RpZmYnKQ0KbW9kZWxzIDwtIGxpc3QoKQ0Ka2V5cyA8LSBjaGFyYWN0ZXIoKQ0KZm9yICh2ZF8gaW4gdmQpIHsNCiAgZm9yICh2aV8gaW4gdmkpIHsNCiAgICBrZXkgPC0gcGFzdGUodmRfLCB2aV8sIHNlcCA9ICJ+IikNCiAgICBrZXlzIDwtIGMoa2V5cywga2V5KQ0KICAgIGYgPC0gcGFzdGUodmRfLCAnficsIHZpXywgJysgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1cnKQ0KICAgIG1vZGVsc1tba2V5XV0gPC0gbG0oZiwgZGF0YT1kYXRvc19tb2RlbCkNCiAgfQ0KfQ0KYGBgDQoNCg0KIyMgSERJIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KIyMjIE9EQS5BTEwNCkhESSA9IE9EQS5BTEwgKyBDQyArIEdFICsgUFYgKyBSUSArIFJMICsgVkEgKyBQT1AuR1JPVw0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsc1tba2V5c1sxXV1dKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5OSUgZXhjZXB0byBSZWd1bGF0b3J5IFF1YWxpdHkNCmBgYA0KIyMjDQoNCiMjIyBPREEuQUxMX2RpZmYNCkhESSA9IE9EQS5BTExfZGlmZiArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQpgYGB7cn0NCnN1bW1hcnkobW9kZWxzW1trZXlzWzJdXV0pDQojIFRvZGFzIGxhcyB2YXJpYWJsZXMgc29uIHNpZ25pZmljYXRpdmFzIGFsIDk5JSBleGNlcHRvIE9EQS5BTExfZGlmZiB5IFJlZ3VsYXRvcnkgUXVhbGl0eQ0KYGBgDQojIyMNCg0KIyMjIE9EQS5QQw0KSERJID0gT0RBLlBDICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbHNbW2tleXNbM11dXSkNCiMgVG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgYWwgOTklIGV4Y2VwdG8gUmVndWxhdG9yeSBRdWFsaXR5DQpgYGANCiMjIw0KDQojIyMgT0RBLlBDX2RpZmYNCkhESSA9IE9EQS5QQ19kaWZmICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbHNbW2tleXNbNF1dXSkNCiMgVG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgYWwgOTklIGV4Y2VwdG8gIE9EQS5BTExfZGlmZiB5IFJlZ3VsYXRvcnkgUXVhbGl0eQ0KYGBgDQojIyMNCg0KIyMNCg0KIyMgSERJX2RpZmYgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQojIyMgT0RBLkFMTA0KSERJX2RpZmYgPSBPREEuQUxMICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbHNbW2tleXNbNV1dXSkNCiMgVG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgYWwgOTUlIGV4Y2VwdG8gT0RBLkFMTCwgQ29udHJvbCBvZiBDb3JydXB0aW9uIHkgUnVsZSBvZiBMYXcNCmBgYA0KIyMjDQoNCiMjIyBPREEuQUxMX2RpZmYNCkhESV9kaWZmID0gT0RBLkFMTF9kaWZmICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbHNbW2tleXNbNl1dXSkNCiMgVG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgYWwgOTUlIGV4Y2VwdG8gQ29udHJvbCBvZiBDb3JydXB0aW9uIHkgVm9pY2UgYW5kIEFjY291bnRhYmlsaXR5DQpgYGANCiMjIw0KDQojIyMgT0RBLlBDDQpIRElfZGlmZiA9IE9EQS5QQyArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQpgYGB7cn0NCnN1bW1hcnkobW9kZWxzW1trZXlzWzddXV0pDQojIFRvZGFzIGxhcyB2YXJpYWJsZXMgc29uIHNpZ25pZmljYXRpdmFzIGFsIDk1JSBleGNlcHRvIFJ1bGUgb2YgTGF3IHkgVm9pY2UgYW5kIEFjY291bnRhYmlsaXR5DQpgYGANCiMjIw0KDQojIyMgT0RBLlBDX2RpZmYNCkhESV9kaWZmID0gT0RBLlBDX2RpZmYgKyBDQyArIEdFICsgUFYgKyBSUSArIFJMICsgVkEgKyBQT1AuR1JPVw0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsc1tba2V5c1s4XV1dKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5NSUgZXhjZXB0byBDb250cm9sIG9mIENvcnJ1cHRpb24geSBWb2ljZSBhbmQgQWNjb3VudGFiaWxpdHkNCmBgYA0KIyMjDQoNCiMjDQoNCiMjIEdQRC5QQyB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNCiMjIyBPREEuQUxMDQpHUEQuUEMgPSBPREEuQUxMICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbHNbW2tleXNbOV1dXSkNCiMgVG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgYWwgOTklIGV4Y2VwdG8gT0RBLkFMTCwgQ29udHJvbCBvZiBDb3JydXB0aW9uLCBSZWd1bGF0b3J5IFF1YWxpdHkgeSBSdWxlIG9mIExhdw0KYGBgDQojIyMNCg0KIyMjIE9EQS5BTExfZGlmZg0KR1BELlBDID0gT0RBLkFMTCArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQpgYGB7cn0NCnN1bW1hcnkobW9kZWxzW1trZXlzWzEwXV1dKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5OSUgZXhjZXB0byBPREEuQUxMX2RpZmYsIENvbnRyb2wgb2YgQ29ycnVwdGlvbiwgUmVndWxhdG9yeSBRdWFsaXR5IHkgUnVsZSBvZiBMYXcNCmBgYA0KIyMjDQoNCiMjIyBPREEuUEMNCkdQRC5QQyA9IE9EQS5QQyArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQpgYGB7cn0NCnN1bW1hcnkobW9kZWxzW1trZXlzWzExXV1dKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5OSUgZXhjZXB0byBSdWxlIG9mIExhdw0KYGBgDQojIyMNCg0KIyMjIE9EQS5QQ19kaWZmDQpHUEQuUEMgPSBPREEuUENfZGlmZiArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQpgYGB7cn0NCnN1bW1hcnkobW9kZWxzW1trZXlzWzEyXV1dKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5OSUgZXhjZXB0byBPREEuQUxMX2RpZmYsIENvbnRyb2wgb2YgQ29ycnVwdGlvbiwgUmVndWxhdG9yeSBRdWFsaXR5IHkgUnVsZSBvZiBMYXcNCmBgYA0KIyMjDQoNCiMjDQoNCiMjIEdQRC5QQ19kaWZmIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KIyMjIE9EQS5BTEwNCkdQRC5QQ19kaWZmID0gT0RBLkFMTCArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQpgYGB7cn0NCnN1bW1hcnkobW9kZWxzW1trZXlzWzEzXV1dKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5NSUgZXhjZXB0byBPREEuQUxMLCBDb250cm9sIG9mIENvcnJ1cHRpb24sIFJlZ3VsYXRvcnkgUXVhbGl0eSB5IFZvaWNlIGFuZCBBY2NvdW50YWJpbGl0eQ0KYGBgDQojIyMNCg0KIyMjIE9EQS5BTExfZGlmZg0KR1BELlBDX2RpZmYgPSBPREEuQUxMICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbHNbW2tleXNbMTRdXV0pDQojIFRvZGFzIGxhcyB2YXJpYWJsZXMgc29uIHNpZ25pZmljYXRpdmFzIGFsIDk1JSBleGNlcHRvIE9EQS5BTExfZGlmZiwgQ29udHJvbCBvZiBDb3JydXB0aW9uLCBSZWd1bGF0b3J5IFF1YWxpdHkgeSBWb2ljZSBhbmQgQWNjb3VudGFiaWxpdHkNCmBgYA0KIyMjDQoNCiMjIyBPREEuUEMNCkdQRC5QQ19kaWZmID0gT0RBLlBDICsgQ0MgKyBHRSArIFBWICsgUlEgKyBSTCArIFZBICsgUE9QLkdST1cNCmBgYHtyfQ0Kc3VtbWFyeShtb2RlbHNbW2tleXNbMTVdXV0pDQojIFRvZGFzIGxhcyB2YXJpYWJsZXMgc29uIHNpZ25pZmljYXRpdmFzIGFsIDk1JSBleGNlcHRvIE9EQS5QQywgQ29udHJvbCBvZiBDb3JydXB0aW9uLCBQb2xpdGljYWwgU3RhYmlsaXR5LCBSZWd1bGF0b3J5IFF1YWxpdHkgeSBWb2ljZSBhbmQgQWNjb3VudGFiaWxpdHkNCmBgYA0KIyMjDQoNCiMjIyBPREEuUENfZGlmZg0KR1BELlBDX2RpZmYgPSBPREEuUENfZGlmZiArIENDICsgR0UgKyBQViArIFJRICsgUkwgKyBWQSArIFBPUC5HUk9XDQpgYGB7cn0NCnN1bW1hcnkobW9kZWxzW1trZXlzWzE2XV1dKQ0KIyBUb2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcyBhbCA5NSUgZXhjZXB0byBPREEuUENfZGlmZiwgQ29udHJvbCBvZiBDb3JydXB0aW9uLCBSZWd1bGF0b3J5IFF1YWxpdHkgeSBWb2ljZSBhbmQgQWNjb3VudGFiaWxpdHkNCmBgYA0KIyMjDQoNCiMjDQoNCiMNCg0KU2UgcmV2aXNhcmEgbGFzIHJlbGFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcyBncmFmaWNhbWVudGUNCg0KIyBWaXN1YWxpemFjaW9uIGRlIGRhdG9zIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KIyMgSERJDQoNCmBgYHtyfQ0KbXlfcGxvdCAgPC0gbGlzdCgpDQoNCmZvciAoY29sIGluIGMoJ0RULk9EQS5BTExELkNEJywgJ0RULk9EQS5PREFULlBDLlpTJywgJ0RULk9EQS5BTExELkNEX2RpZmYnLCAnRFQuT0RBLk9EQVQuUEMuWlNfZGlmZicsIA0KICAgICAgICAgICAgICAnQ0MuRVNUJywgJ0dFLkVTVCcsICdQVi5FU1QnLCAnUlEuRVNUJywgJ1JMLkVTVCcsICdWQS5FU1QnKSkgew0KICBteV9wbG90W1tjb2xdXSA8LSBwbG90X2x5KHggPSBkYXRvc19tb2RlbFtbY29sXV0sIHkgPSBkYXRvc19tb2RlbFtbJ2hkaSddXSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywgbmFtZSA9IGNvbCkgIA0KfQ0Kc3VicGxvdChteV9wbG90WzE6NF0sIG5yb3dzID0gMiwgbWFyZ2luID0gMC4wNSkgJT4lIGxheW91dCh0aXRsZSA9ICdIREkgdnMgT0RBJykNCnN1YnBsb3QobXlfcGxvdFs1OjEwXSwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjA1KSAlPiUgbGF5b3V0KHRpdGxlID0gJ0hESSB2cyBHT0InKQ0KYGBgDQoNCiMjIEhESSBkaWZmDQoNCmBgYHtyfQ0KbXlfcGxvdCAgPC0gbGlzdCgpDQoNCmZvciAoY29sIGluIGMoJ0RULk9EQS5BTExELkNEJywgJ0RULk9EQS5PREFULlBDLlpTJywgJ0RULk9EQS5BTExELkNEX2RpZmYnLCAnRFQuT0RBLk9EQVQuUEMuWlNfZGlmZicsIA0KICAgICAgICAgICAgICAnQ0MuRVNUJywgJ0dFLkVTVCcsICdQVi5FU1QnLCAnUlEuRVNUJywgJ1JMLkVTVCcsICdWQS5FU1QnKSkgew0KICBteV9wbG90W1tjb2xdXSA8LSBwbG90X2x5KHggPSBkYXRvc19tb2RlbFtbY29sXV0sIHkgPSBkYXRvc19tb2RlbFtbJ2hkaV9kaWZmJ11dLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLCBuYW1lID0gY29sKSAgDQp9DQpzdWJwbG90KG15X3Bsb3RbMTo0XSwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjA1KSAlPiUgbGF5b3V0KHRpdGxlID0gJ0hESSBkaWZmIHZzIE9EQScpDQpzdWJwbG90KG15X3Bsb3RbNToxMF0sIG5yb3dzID0gMiwgbWFyZ2luID0gMC4wNSkgJT4lIGxheW91dCh0aXRsZSA9ICdIREkgZGlmZiB2cyBHT0InKQ0KYGBgDQoNCiMjIEdQRC5QQw0KDQpgYGB7cn0NCm15X3Bsb3QgIDwtIGxpc3QoKQ0KZm9yIChjb2wgaW4gYygnRFQuT0RBLkFMTEQuQ0QnLCAnRFQuT0RBLk9EQVQuUEMuWlMnLCAnRFQuT0RBLkFMTEQuQ0RfZGlmZicsICdEVC5PREEuT0RBVC5QQy5aU19kaWZmJywgDQogICAgICAgICAgICAgICdDQy5FU1QnLCAnR0UuRVNUJywgJ1BWLkVTVCcsICdSUS5FU1QnLCAnUkwuRVNUJywgJ1ZBLkVTVCcpKSB7DQogIG15X3Bsb3RbW2NvbF1dIDwtIHBsb3RfbHkoeCA9IGRhdG9zX21vZGVsW1tjb2xdXSwgeSA9IGRhdG9zX21vZGVsW1snTlkuR0RQLlBDQVAuQ0QnXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsIG5hbWUgPSBjb2wpICANCn0NCnN1YnBsb3QobXlfcGxvdFsxOjRdLCBucm93cyA9IDIsIG1hcmdpbiA9IDAuMDUpICU+JSBsYXlvdXQodGl0bGUgPSAnR0RQLlBDIHZzIE9EQScpDQpzdWJwbG90KG15X3Bsb3RbNToxMF0sIG5yb3dzID0gMiwgbWFyZ2luID0gMC4wNSkgJT4lIGxheW91dCh0aXRsZSA9ICdHRFAuUEMgdnMgR09CJykNCg0KYGBgDQoNCiMjIEdQRC5QQyBkaWZmDQoNCmBgYHtyfQ0KbXlfcGxvdCAgPC0gbGlzdCgpDQpmb3IgKGNvbCBpbiBjKCdEVC5PREEuQUxMRC5DRCcsICdEVC5PREEuT0RBVC5QQy5aUycsICdEVC5PREEuQUxMRC5DRF9kaWZmJywgJ0RULk9EQS5PREFULlBDLlpTX2RpZmYnLCANCiAgICAgICAgICAgICAgJ0NDLkVTVCcsICdHRS5FU1QnLCAnUFYuRVNUJywgJ1JRLkVTVCcsICdSTC5FU1QnLCAnVkEuRVNUJykpIHsNCiAgbXlfcGxvdFtbY29sXV0gPC0gcGxvdF9seSh4ID0gZGF0b3NfbW9kZWxbW2NvbF1dLCB5ID0gZGF0b3NfbW9kZWxbWydOWS5HRFAuUENBUC5DRF9kaWZmJ11dLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLCBuYW1lID0gY29sKSAgDQp9DQpzdWJwbG90KG15X3Bsb3RbMTo0XSwgbnJvd3MgPSAyLCBtYXJnaW4gPSAwLjA1KSAlPiUgbGF5b3V0KHRpdGxlID0gJ0dEUC5QQyBkaWZmIHZzIE9EQScpDQpzdWJwbG90KG15X3Bsb3RbNToxMF0sIG5yb3dzID0gMiwgbWFyZ2luID0gMC4wNSkgJT4lIGxheW91dCh0aXRsZSA9ICdHRFAuUEMgZGlmZiB2cyBHT0InKQ0KDQpgYGANCg0KIyANCg0KTm8gc2UgdmUgdW5hIHJlbGFjaW9uIGNsYXJhLCBoYXkgdGFudG8gcGFpc2VzIGNvbiBwdW50ZW9zIGFsdG9zIHkgYmFqb3MgZGUgR09CIHF1ZSB0aWVuZW4gdGFudG8gSElEIGFsdG9zIG8gYmFqb3MgUXVpemEgcHVlZGUgdmVyc2UgdW5hIGxldmUgcmVsYWNpb24gZGUgbWF5b3IgcHVudGVvIGVuIEdPQiBhY29tcGHDsWFkbyBkZSBtZWpvciBwdW50ZW8gZGVuIEhESSBMb3MgZGF0b3MgZGUgR1BEIHNpIG11ZXN0cmFuIHVuYSByZWxhY2lvbiBwb3NpdGl2YSBjb24gZWwgSERJIHZpc3RvIGVuIGxhcyBncmFmaWNhcw0KDQpTZSByZWFsaXphcmEgZWwgbWlzbW8gcHJvY2VzbyBjb24gZWwgY3JlY2ltaWVudG8gbyBkZWNyZWNpbWllbnRvIGRlIEhESSBhbnVhbA0KDQojIFZpc3VhbGl6YWNpb24gZGUgRGF0b3MgaGlzdG9yaWENCg0KVmllbmRvIGxhIGhpc3RvcmlhIGRlIGxhcyB2YXJpYWJsZXMgZW4gZWwgdGllbXBvIChwb3IgcGFpcykNCg0KYGBge3J9DQpkYXRvc19tb2RlbCAlPiUgZmlsdGVyKGlzbzJjID09ICdBRicpICU+JSBwbG90X2x5KHggPSB+eWVhcikgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5oZGksIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnaGRpJykgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5OWS5HRFAuUENBUC5DRCAvIDEwMDAsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnZ2RwLnBjJykgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5EVC5PREEuQUxMRC5DRCAvIDEwMDAwMDAwMDAwLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzK21hcmtlcnMnLCBuYW1lID0gJ09EQS5BTEwnKSAgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5EVC5PREEuT0RBVC5QQy5aUyAvIDEwMDAsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnT0RBLlBDJykgICU+JSANCiAgYWRkX3RyYWNlKHkgPSB+Q0MuRVNULCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzK21hcmtlcnMnLCBuYW1lID0gJ0NDJykgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5HRS5FU1QsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnR0UnKSAgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5QVi5FU1QsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnUFYnKSAgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5SUS5FU1QsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnUlEnKSAgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5STC5FU1QsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnUkwnKSAgJT4lIA0KICBhZGRfdHJhY2UoeSA9IH5WQS5FU1QsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsIG5hbWUgPSAnVkEnKQ0KYGBgDQoNCiMgTW9kZWxvcyBFZmVjdG9zIGZpam9zIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KIyMgSERJIH4gT0RBLkFMTA0KDQpgYGB7cn0NCnBsbShoZGkgfiBEVC5PREEuQUxMRC5DRCArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XLCBkYXRhPWRhdG9zX21vZGVsLA0KICAgIGluZGV4ID0gYygiaXNvMmMiLCAieWVhciIpLCBtb2RlbCA9ICJ3aXRoaW4iKQ0KDQojIHN1bW1hcnkobG0oaGRpIH4gRFQuT0RBLkFMTEQuQ0QgKyBDQy5FU1QgKyBHRS5FU1QgKyBQVi5FU1QgKyBSUS5FU1QgKyBSTC5FU1QgKyBWQS5FU1QgKyBTUC5QT1AuR1JPVyArIGlzbzJjLCBkYXRhPWRhdG9zX21vZGVsKSkNCiMgQ29ycnVwdGlvbiBDb250cm9sLCBHb3Zlcm5tZW50IEVmZmVjdGl2ZW5lc3MsIFBvbGl0aWNhbCBTdGFiaWxpdHkgeSBWb2ljZSBhbmQgQWNjb3VudGFiaWxpdHkgbm8gc29uIHNpZ25pZmljYXRpdmFzDQpgYGANCiMjDQoNCiMjIEhESSB+IE9EQS5QQw0KDQpgYGB7cn0NCnBsbShoZGkgfiBEVC5PREEuT0RBVC5QQy5aUyArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XLCBkYXRhPWRhdG9zX21vZGVsLA0KICAgIGluZGV4ID0gYygiaXNvMmMiLCAieWVhciIpLCBtb2RlbCA9ICJ3aXRoaW4iKQ0KDQojc3VtbWFyeShsbShoZGkgfiBEVC5PREEuT0RBVC5QQy5aUyArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XICsgaXNvMmMsIGRhdGE9ZGF0b3NfbW9kZWwpKQ0KIyBDb3JydXB0aW9uIENvbnRyb2wsIEdvdmVybm1lbnQgRWZmZWN0aXZlbmVzcyB5IFZvaWNlIGFuZCBBY2NvdW50YWJpbGl0eSBubyBzb24gc2lnbmlmaWNhdGl2YXMNCmBgYA0KIyMNCg0KIyMgR0RQLlBDIH4gT0RBLkFMTA0KDQpgYGB7cn0NCnBsbShOWS5HRFAuUENBUC5DRCB+IERULk9EQS5BTExELkNEICsgQ0MuRVNUICsgR0UuRVNUICsgUFYuRVNUICsgUlEuRVNUICsgUkwuRVNUICsgVkEuRVNUICsgU1AuUE9QLkdST1csIGRhdGE9ZGF0b3NfbW9kZWwsDQogICAgaW5kZXggPSBjKCJpc28yYyIsICJ5ZWFyIiksIG1vZGVsID0gIndpdGhpbiIpDQoNCiNzdW1tYXJ5KGxtKE5ZLkdEUC5QQ0FQLkNEIH4gRFQuT0RBLkFMTEQuQ0QgKyBDQy5FU1QgKyBHRS5FU1QgKyBQVi5FU1QgKyBSUS5FU1QgKyBSTC5FU1QgKyBWQS5FU1QgKyBTUC5QT1AuR1JPVyArIGlzbzJjLCBkYXRhPWRhdG9zX21vZGVsKSkNCiMgSW50ZXJjZXB0bywgQ29ycnVwdGlvbiBDb250cm9sLCBSZWd1bGF0b3J5IFF1YWxpdHksIFJ1bGUgb2YgTGF3LCBWb2ljZSBhbmQgQWNjb3VudGFiaWxpdHkgeSBQb3B1bGF0aW9uIEdyb3d0aCBubyBzb24gc2lnbmlmaWNhdGl2YXMNCmBgYA0KIyMNCg0KIyMgR0RQLlBDIH4gT0RBLlBDDQoNCmBgYHtyfQ0KcGxtKE5ZLkdEUC5QQ0FQLkNEIH4gRFQuT0RBLk9EQVQuUEMuWlMgKyBDQy5FU1QgKyBHRS5FU1QgKyBQVi5FU1QgKyBSUS5FU1QgKyBSTC5FU1QgKyBWQS5FU1QgKyBTUC5QT1AuR1JPVywgZGF0YT1kYXRvc19tb2RlbCwNCiAgICBpbmRleCA9IGMoImlzbzJjIiwgInllYXIiKSwgbW9kZWwgPSAid2l0aGluIikNCg0KI3N1bW1hcnkobG0oTlkuR0RQLlBDQVAuQ0QgfiBEVC5PREEuT0RBVC5QQy5aUyArIENDLkVTVCArIEdFLkVTVCArIFBWLkVTVCArIFJRLkVTVCArIFJMLkVTVCArIFZBLkVTVCArIFNQLlBPUC5HUk9XICsgaXNvMmMsIGRhdGE9ZGF0b3NfbW9kZWwpKQ0KIyBDb3JydXB0aW9uIENvbnRyb2wsIFJlZ3VsYXRvcnkgUXVhbGl0eSwgUnVsZSBvZiBMYXcgeSBWb2ljZSBhbmQgQWNjb3VudGFiaWxpdHkgbm8gc29uIHNpZ25pZmljYXRpdmFzDQpgYGANCiMjDQoNCg==